package Git2024_5_14;

public class Mybatis2024_5_14 {
    /**
     * POJO
     * 1 实体类 entity 和数据库进行一一映射关系-ER图
     * 2 DTO 客户端传递数据到服务端 服务端用DTO类进行接收
     * 3 VO类 服务器端返回给客户端数据 服务器使用VO类返回
     *
     * ORM 对象关系映射
     *
     * XML文件配置Mybatis
     * Mybatis提供了注解方式和XML文件方式
     *  注解方式 优点: 操作简单
     *         缺点: 与java耦合度高 不适合复杂业务逻辑
     *  XML文件 优点: 适用于复杂工程 将SQL与java解耦 支持动态SQL语句 实现了SQL语句的重用
     *         缺点: 操作复杂
     *
     * 编码流程
     * 1 勾选依赖
     * 2 配置文件中配置数据库连接信息 和 xml文件映射的位置
     * 3 创建实体类
     * 4 接口和接口方法
     * 5 创建XML文件并编译SQL语句-名称空间(namespace)-id属性值
     * 6 测试
     *
     * 常见异常
     * 1 SQL语法异常
     * 2 TooManyResultsException 查询出多条数据 但是未使用List接收
     * 3 BeanCreationException
     *      所有测试方法都无法执行-XML文件出现语法问题
     *      执行测试文件时 会检查所有XML文件是否有语法错误
     */

    /*---------------------------------------正课-------------------------------------------*/
    /**
     * 动态SQL语句
     *  根据传入的数据不同 动态生成对应的SQL语句
     * 情景
     *  若直接将多个数据存入List<ids>对象传入 例如Xxx=#{ids} 会产生语法错误 正确的SQL应为 IN(?,?,?)
     */
    /**
     * 动态修改
     *  <set> 给值 </set>
     *  <if> 判断 </if>
     *  包含关系:
     *      <set>
     *          <if test="对应值1属性名的判断条件">对应值1=#{对应值1属性名},</if>
     *          <if test="对应值2属性名的判断条件">对应值2=#{对应值2属性名},</if>
     *          <if>\..</if>---最后一个句尾不添加逗号
     *      </set>
     */
    /**
     * 动态删除
     *  1.数组方式
     *      <foreach collection="array" item="aaa" separator=",">
     *          #{aaa}---每次遍历 将数组中的元素依次拿取,并在每个元素末尾添加指定的分隔符(此处为",")
     *                   直到拿取最后一个元素 末尾不会添加分隔符
     *      </foreach>
     * 名称解释
     *   1.1 <foreach></foreach>标签: 遍历标签 一般用于动态删除
     *   1.2 collection属性: 遍历对象类型 数组为array 集合为list(在xml中 所有类型都是小写的)
     *   1.3 item属性: 变量名
     *   1.4 separator属性: 分隔符
     *  2.List集合形式
     */
    /**
     * 统计数量
     * 注意 查询数据条数时 返回值为int 且resultType为int
     *     一般resultType为VO类类型 此处较为特殊
     */
    /**
     * -支持SQL语句的重用-
     * 在外部通过标签定义变量 在xml中通过标签引用
     * <sql id="变量名,唯一标识"> \.. 重复SQL \.. </sql>
     * <include refid="sql标签中的id名"> \.. 引用重复SQL \.. </include>
     */
    //标签的提前闭合
    /**
     * <aaa></aaa> -> 在第一个">"前加一个"/"即可,前提是"><"之间无内容 -> <aaa/ -> <aaa/>
     */
    //应对多对多和一对多的复杂查询
    /**
     * resultMap
     * 相同点: resultMap常规查询(单表查询或多表简单查询)时与resultType无异
     *        用来定义查询结果与java对象属性的映射关系
     * 不同点: 1.resultType适合单表查询或多表之间的简单查询
     *        2.resultMap可以自定义查询结果与java对象属性的映射关系
     *          且更适合用于多表之间(一对多或多对多)的复杂查询
     *
     *     <resultMap id="该标签的唯一标识" type="指定的java类型路径(如VO类路径)">
     *         --自定义查询字段与java类中属性的映射关系,需要一一映射--
     *         <id column="id" property="id"></id>---------------------映射主键字段 左为sql中的字段名 右为java类中属性名
     *         <result column="content" property="content"></result>---映射非主键字段 统一使用<result>标签
     *         <result column="user_id" property="userId"></result>----映射非主键字段 当二者名称不一致时 无需再创造别名
     *         <..></..>
     *         注意:
     *         <result column="aaa" property="content"></result>-------映射非主键字段 当已经在SQL中规定别名(例如"aaa")
     *                                                                 则只需要将别名填入即可完成映射
     *     </resultMap>
     *
     *     <select id="方法名" resultMap="resultMap标签设置的唯一标识">-----注意 此处为resultMap而非resultType 注意区分
     *         --撰写SQL--
     *     </select>
     */
    /**
     * 关于resultMap单表查询的操作步骤
     * 1.创建VO类
     * 2.接口方法
     * 3.xml配置SQL
     * 4.测试
     */
    /**
     * ResultMap可以实现: 一对多情况下 将"一"作为VO类的属性 而将"多"整合为一个集合 减少冗余
     *
     *          <resultMap id="唯一标识" type="对应java类型路径(如VO类路径)">
     *              <id column="数据库字段名[别名1]" property=""></id>---------当字段名重复时 需要设置别名加以区分 否则会映射错误
     *              <result column="" property=""></result>
     *              \..
     *              <collection property="映射集合名" ofType="集合中元素类型">---一对多中的多 需要放在该标签中 否则主键冲突会直接报错
     *                                                                      ofType中需要填写集合元素类型的类路径 例如实体类或指定VO类
     *                  <id column="数据库字段[名别名2]" property=""></id>-----当字段名重复时 需要设置别名加以区分 否则会映射错误
     *                  <result column="" property=""></result>
     *                  <result column="" property=""></result>
     *                  \..
     *              </collection>
     *          </resultMap>
     *
     *          <select id="" resultMap="resultMap的唯一标识">
     *              --撰写SQL语句--
     *          </select>
     *
     * ResultMap多表:
     *     1.<id>标签：映射主键字段;
     *     2.<result>标签：映射普通字段;
     *     3.column属性：数据库字段名[别名];
     *     4.property属性：Java类型属性名;
     *     5.collection标签：映射集合;
     *     6.ofType属性：集合中元素类型;
     *
     * 注意 不同表中的字段名重复 需要用别名加以区分
     */
    //ail + 回车 可以快捷创建类

    //tinyint 微小整型 只占1个字节---sql语言中的一种字段类型
    /*拓展
     * tinyint 是一种数据库数据类型，通常用于存储非常小的整数。
     * 在SQL中，tinyint 通常用于表示一个8位（1字节）的无符号整数，它可以存储的值范围是0到255。
     * 如果使用有符号的tinyint，则存储范围会变为-128到127。
     * 这个数据类型适用于那些只需要少量整数值的场景，比如布尔值（用0和1表示）或者小的分类编号。
     *
     * 在Java中，没有直接对应tinyint的数据类型，因为Java的标准整数类型byte也是8位，但它的取值范围是-128到127，与有符号的tinyint类似。
     * 如果你从数据库中读取tinyint类型的值，可以将其映射为Java的byte或short类型，具体取决于你的需求和数据的性质。
     */

    /**-------------------------------------猎才计划-------------------------------------------*/
    // SHOW ENGINES 可以查看数据库支持的存储引擎
    // NULL值无法进行索引查询

    // 优化查询
    // 使用EXPLAIN查询SQL的执行计划 用在查询语句之前 执行计划中 type字段下表示的内容包含是否应用了索引
    // UNION ALL 合并 取查询结果的并集 用在查询语句之前 代替UNION 减少排序
    // 利用小表去驱动大表 减少嵌套循环中的循环次数
    // 善用索引 index

    // 客户端
    // 在客户端上 使用连接池(参数配置)-让连接实现复用(享源)
    // 避免大事务(数据量极大 操作时极其耗时 一条数据错误 所有数据都需要回滚)
    // 返回值数据多使用物理分页(业务层面分页)

    // 索引的缺陷
    // 一种数据结构 会占用额外的存储空间 例如书的目录和正文部分 都会占用空间
    // 更新数据时 需要按需同步更新索引

    // MySQL中的索引如何分类
    // 按照逻辑应用维度: 主键 普通 联合 唯一 空间索引(不同存储引擎支持的索引不同)
    // 从物理存储维度: 聚簇索引(数据和索引一起存储) 非聚簇索引(数据和索引分开存储)
    // 从数据结构维度: hash索引(散列表存储方式 利于存储 不利于查询 支持等值查询 但是不支持范围查询)
    //              B+Tree索引(BTree的升级版本 InnoDB存储引擎默认 支持范围查询)等等

    //查询表中的索引: SHOW INDEX FROM 表名

    // MyBatis弊端: 额外依赖引入 引入额外映射文件 配置相关文件
    //        优势: 天然支持动态SQL

    //如何创建索引
    //1.创建表时创建索引
    //2.创建表后创建索引
    //      2.1
}
